/**
 * Copyright (c) 2009 blurredVision
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
 * associated documentation files (the "Software"), to deal in the Software without restriction, 
 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or 
 * substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 
 * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 
 * OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
#ifndef __SINGLETON_H__
#define __SINGLETON_H__

#pragma once

/**
 * \ingroup CoreEngine
 *
 * A Singleton object.<br>
 * A class that is only instanced once by the application can be derived from Singleton 
 * in the following way:
 *
 * <code>
 * class MyClass : public Singleton<MyClass>
 * { 
 * public: 
 *   void myfunction() {}
 * };
 * </code>
 *
 * Now, it is possible to retreive the instance of this class from anywhere in the 
 * application by calling<br>
 * <code>
 * MyClass::Instance()->myfunction();
 * </code>
 *
 * \date 03-28-2007
 *
 * \author juckel
 *
 */
template <class T>
class Singleton
{
public:
	/// Returns the Singleton instance
	static T* Instance()
	{
		/// If no instance is there, create one
		if (!pInstance) 
			pInstance = new T();
		/// Return the instance
		return pInstance;
	}

	void Destroy()
	{
		DELETE_POINTER(pInstance);
	}
	
private:
	static T* pInstance;	///< The single instance of the object
};


template <class T>
T* Singleton<T>::pInstance = NULL;

#endif
